\section{El módulo}

\texttt{GRID::Machine} es un módulo Perl
escrito y mantenido por {\bf Casiano Rodríguez León} \cite{CasianoGridMachineDoc}
que provee \textit{Remote Procedure Calls} o llamadas a procedimientos
remotos (RPC) a través de un enlace SSH.

Para su utilización deben poderse establecer autenticaciones
SSH automáticas entre la máquina local y las máquinas remotas
en donde se desee trabajar.

Las características principales de este módulo son:

\begin{itemize}
\item
\textit{Remote Procedure Calls} (RPC). Rutinas 
en el lado remoto pueden ser llamadas con estructuras
de datos arbitrariamente complejas como argumentos
desde el lado local.

\item
El resultado de una llamada remota es un objeto de
la clase \texttt{GRID::Machine::Result}. Entre sus
atributos se encuentran el resultado de la llamada
(\texttt{result}), la salida producida en \texttt{stdout}
y \texttt{stderr}.

\item
Servicios para la transferencia de ficheros.

\item
Soporte para escribir y administrar módulos remotos
y para la transferencia de clases y módulos entre máquinas.

\item
Un protocolo extensible
\end{itemize}

\section{Métodos útiles para el usuario de \texttt{Bench::Test}}

El módulo \texttt{Bench::Test::Remote} hace uso de la clase
\texttt{GRID::Machine} para establecer las conexiones y lanzar
las ejecuciones en las máquinas remotas.

El usuario puede definir en la creación del objeto
\texttt{Bench::Test::Remote} dos parámetros \texttt{PREAMBLE} y
\texttt{POSTAMBLE} útiles para preparar y liberar los entornos
de ejecución. Se tratan de dos referencias a rutina que reciben
como único parámetro el objeto de la clase \texttt{GRID::Machine}
utilizado para establecer la conexión.

Gracias a ello, el usuario dispone de toda la funcionalidad
de \texttt{GRID::Machine} para trabajar en la máquina remota.

No se pretende que el usuario conozca el 100\% de las capacidades
de éste módulo, pero es recomendable que conozca unos cuantos
métodos que le podrán ser útiles a la hora de escribir
las rutinas \texttt{PREAMBLE} y \texttt{POSTAMBLE}.

\subsection{Algunas funciones simples}

Las siguientes funciones realizan la misma operación que
sus homónimas en Perl:

\begin{itemize}
\item \texttt{chdir}
\item \texttt{getcwd}
\item \texttt{glob}
\item \texttt{mkdir}
\item \texttt{system}
\item \texttt{umask}
\end{itemize}

\subsection{La función \texttt{system}}

Ejecuta la función \texttt{system} en la máquina remota.
Véase un ejemplo:

\begin{verbatim}
   $ cat uname.pl
   #!/usr/bin/perl -w
   use strict;
   use GRID::Machine;
   
   my $host = shift || 'user@remote.host';

   my $machine = GRID::Machine->new(
                    host       => $host,
                    sendstdout => 1,
                    startdir   => 'projects'
                 );

   my $dir = $machine->getcwd->result;
   print "$dir\n";

   print $machine->system('uname -a');
\end{verbatim}

Al ejecutar este pequeño script se obtiene 
una salida similar a esta:

\begin{verbatim}
   /home/user/projects
   Linux machine 2.6.24 #1 Tue Aug 16 13:22:48 UTC 2005 i686 GNU/Linux
\end{verbatim}

Esta función puede ser muy útil a la hora de compilar
en la máquina remota ejecutando la orden \texttt{make}:

\begin{verbatim}
   $machine->chdir($project_dir);
   $machine->system('make');
\end{verbatim}

\subsection{La función \texttt{qx}}

Similar a las comillas de ejecución (\textit{backticks}).
El resultado depende del contexto. En un contexto de 
lista devuelve una lista con las líneas de la salida.
En un contexto escalar devuelve una cadena de caracteres
con la salida.

\subsection{La función \texttt{tar}}

La función \texttt{tar} es equivalente a:

\begin{verbatim}
   system('tar', $options, '-f', $file)
\end{verbatim}

Donde \texttt{\$options} es una cadena que contiene las
opciones y \texttt{\$file} el fichero que se desea
comprimir/descomprimir. 

La función devuelve el código de error proveniente de \texttt{tar}.
Véase un ejemplo:

\begin{verbatim}
   $m->tar($dist, '-xz')->ok
      or warn "$host: Can't extract files from $dist\n";
\end{verbatim}

\subsection{La función \texttt{version}}

Su sintaxis es la siguiente:

\begin{verbatim}
   $machine->version('Some::Module')
\end{verbatim}

Devuelve la versión (\texttt{VERSION}) del módulo si éste
está instalado en la máquina y posee un número de versión.

\subsection{La función \texttt{installed}}

Su sintaxis es la siguiente:

\begin{verbatim}
   $machine->installed('Some::Module');
\end{verbatim}

Devuelve \texttt{TRUE} si el módulo dado está instalado en
la máquina remota.

\subsection{Métodos \textit{File Status}}

Se trata de métodos equivalentes a las funciones de test
de ficheros:

\begin{verbatim}
   -r -w -e -x -z -s -f -d   -t -T -B -M -A -C
\end{verbatim}

Debido a que la sintaxis de Perl no permite utilizar los
guiones como nombres de función, se utiliza el \textit{underscore}
o guión bajo. Véase un ejemplo:

\begin{verbatim}
   $machine->mkdir($dir) unless $machine->_w($dir)
\end{verbatim}

